package tjs.study.notes.dotest.redis.locker;

import org.redisson.Redisson;
import org.redisson.RedissonBaseLock;
import org.redisson.RedissonLock;
import org.redisson.api.RedissonClient;
import org.redisson.client.protocol.RedisStrictCommand;
import org.redisson.config.Config;
import tjs.study.notes.dotest.redis.locker.redission.RLockRedissionFactory;
import tjs.study.notes.dotest.zookper.locker.common.TestLockSegmentCommon;

import java.util.concurrent.TimeUnit;

/**
 * Created by Nicky.Tang on 2021/11/11 11:54 上午
 *
 * @since 02.12.10
 */
public class DoTestOfRedission {
    /**
     * lua脚步如下，线程id是为了重入锁
     * {@link RedissonLock#tryLockInnerAsync(long, long, TimeUnit, long, RedisStrictCommand)}
     * 
     * 看门狗默认key过期时间为30秒，间隔10秒，判断key是否过期并续命
     * fixme 不支持当锁总占用时间大于xxx，就释放锁的配置，所以某些情况会导致锁一直被占用
     * {@link RedissonLock#tryAcquireAsync(long, long, TimeUnit, long)}
     *      （scheduleExpirationRenewal(threadId)）// 不设置有效期，才会开启看门狗机制
     *      {@link RedissonBaseLock#renewExpiration()}
     *      
     * 红锁（基本不用）
     * 背景：因为redis主从同步只能为异步的，所以主从切换可能导致key丢失
     * 实现：向多个独立隔离的redis集群加锁
     * 问题：仅减低了异常概率，并没有100%解决。
     * 比如A、B、C、D、E五个集群，key1锁住了A、B、C集群，key1同样可能锁住C、D、E
     * 如果5个集群都锁上才算成功，那么增加每次耗时
     * 现实方案：保证redis稳定高可用；业务方提供兜底措施(限流、唯一索引、幂等等)
     * 
     */
    public static void main(String[] args) throws Exception {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient client = Redisson.create(config);
        RLockRedissionFactory rLockMiniFactory = new RLockRedissionFactory(client);
        TestLockSegmentCommon testLockSegmentCommon = new TestLockSegmentCommon(rLockMiniFactory);
        testLockSegmentCommon.doTestSegment("/goods1113", 2, 1, 1);
    }
}
